subroutine AxessetInit
!
! axesset �¢ã�¸ã�¥ã�¼ã������������è¡����¾ã��.
! NAMELIST#axesset_nml ����¿è¾¼�¿ã��������ç¶����§è�����¾ã��.
!
! "axesset" module is initialized.
! NAMELIST#axesset_nml is loaded in this procedure.
!
! �¢ã�¸ã�¥ã�¼ã����� ; USE statements
!
! �����»æ�°å¦å®��°è¨å®�
! Physical and mathematical constants settings
!
use constants0, only: PI ! $ \pi $ .
! �����. Circular constant
! ����å®��°è¨å®�
! Physical constants settings
!
use constants, only: CpDry, GasRDry ! $ R $ [J kg-1 K-1].
! 乾�大��������.
! Gas constant of air
! �¼å��¹æ�°ã�»æ��大波�°è¨å®�
! Number of grid points and maximum truncated wavenumber settings
!
use gridset, only: GridsetCheckNumberOfLatGrid
! SPMODEL ���¤ã������, ���¢ä����馹������¢è����½æ�°å���������解ã��(å¤�層å�å¿�)
! SPMODEL library, problems on sphere are solved with spherical harmonics
! (multi layer is supported)
!
#ifdef LIB_MPI
#ifdef SJPACK
use wa_mpi_module_sjpack, only: wa_mpi_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => v_Lat, spml_y_Lat_Weight => v_Lat_Weight, spml_jc => jc
#else
use wa_mpi_module, only: wa_mpi_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => v_Lat, spml_y_Lat_Weight => v_Lat_Weight, spml_jc => jc
#endif
#elif AXISYMMETRY
use wa_zonal_module, only: wa_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => y_Lat, spml_y_Lat_Weight => y_Lat_Weight
! $ \Delta \varphi $ [rad.] .
! ç·�º¦åº§æ�����.
! Weight of latitude
#elif SJPACK
use wa_module_sjpack, only: wa_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => y_Lat, spml_y_Lat_Weight => y_Lat_Weight
! $ \Delta \varphi $ [rad.] .
! ç·�º¦åº§æ�����.
! Weight of latitude
#elif AXISYMMETRY_SJPACK
use wa_zonal_module_sjpack, only: wa_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => y_Lat, spml_y_Lat_Weight => y_Lat_Weight
! $ \Delta \varphi $ [rad.] .
! ç·�º¦åº§æ�����.
! Weight of latitude
#else
use wa_module, only: wa_Initial, spml_x_Lon => x_Lon, spml_x_Lon_Weight => x_Lon_Weight, spml_y_Lat => y_Lat, spml_y_Lat_Weight => y_Lat_Weight
! $ \Delta \varphi $ [rad.] .
! ç·�º¦åº§æ�����.
! Weight of latitude
#endif
! ���´Ï����������¼ã�¿æ���
! Prepare vertical sigma level data
!
use sigma_data, only: SigmaDataGetHalf
! NAMELIST ���¡ã�¤ã���¥å�����¢ã�������¼ã���£ã������
! Utilities for NAMELIST file input
!
use namelist_util, only: namelist_filename, NmlutilMsg, NmlutilAryValid
! ���¡ã�¤ã���¥å�ºå��è£���
! File I/O support
!
use dc_iounit, only: FileOpen
! ç¨��¥å�������¡ã��
! Kind type parameter
!
use dc_types, only: STDOUT, TOKEN ! �ã�¼ã���¼ã��. Keywords.
! �¡ã���»ã�¼ã�¸å�ºå��
! Message output
!
use dc_message, only: MessageNotify
! �������
! Character handling
!
use dc_string, only: CPrintf
! OpenMP
!
!$ use omp_lib
! 宣�� ; Declaration statements
!
implicit none
! ä½�æ¥å���
! Work variables
!
logical:: flag_generate_sigma
! ���´å±¤�°ã������������������������
! Flag for generation of sigma levels internally
integer:: i ! �¹ã����������·»å���垩�§å���� DO ���¼ã�����æ¥å���
! Work variables for DO loop in subscript of spectral data
integer:: k ! ���´æ�¹å�������� DO ���¼ã�����æ¥å���
! Work variables for DO loop in vertical direction
real(DP):: Kappa ! $ \kappa = R / C_p $ .
! ä¹¾ç�¥å¤§æ°���������, æ°�ä½�å®��°ã����§æ��±ã�������æ¯�.
! Ratio of gas constant to specific heat in dry air
real(DP):: LonInDeg ! Longitude in unit of degree of a grid point in 1D mode
real(DP):: LatInDeg ! Latitude in unit of degree of a grid point in 1D mode
integer:: unit_nml ! NAMELIST ���¡ã�¤ã�����¼ã���³ç���ç½����.
! Unit number for NAMELIST file open
integer:: iostat_nml ! NAMELIST èªã�¿è¾¼�¿æ���� IOSTAT.
! IOSTAT of NAMELIST read
integer:: OMPNumThreads
! OpenMP �§ã����大ã�¹ã��������.
! openmp_threads �� 1 ����大ã�����¤ã����å®�������
! ISPACK[http://www.gfd-dennou.org/library/ispack/]
! �����¢è����½æ�°å��� OpenMP ä¸���è¨�ç®�
! ���¼ã���³ã������������. ä¸���è¨�ç®���å®�è¡���������,
! å®�è¡������°å�å¤��� OMP_NUM_THREADS
! �� OMPNumThreads 以ä����°å���¨å®�����
! ç����·ã�¹ã�����������æº�����å¿�è¦�������.
!
! OMPNumThreads �� 1 ����大ã�����¤ã��
! ��å®����������°ä¸¦��è¨�ç®����¼ã���³ã���¼ã�°ã������.
character(TOKEN):: rank_str
! ���³ã����. Rank number
integer:: myrank_mpi ! ������. Number of total processes
integer:: nprocs_mpi ! ��º«�����ã�»ã��. Number of my process
integer:: ra ! MPI �����³ã���°æ�¹å�������� DO ���¼ã�����æ¥å���
! Work variables for DO loop in rank number of MPI direction
! NAMELIST å¤��°ç¾¤
! NAMELIST group name
!
namelist /axesset_nml/ Sigma, Depth, flag_generate_sigma, LonInDeg, LatInDeg
!
! �����������¤ã���¤ã��������������ç¶� "axesset#AxessetInit"
! ���½ã�¼ã�¹ã�³ã�¼ã�������§ã������.
!
! Refer to source codes in the initialization procedure
! "axesset#AxessetInit" for the default values.
!
! ���� ; Executable statement
!
if ( axesset_inited ) return
!
! Set number of OpenMP threads
!
OMPNumThreads = 1
!$ OMPNumThreads = omp_get_max_threads()
! �²ã��ä»���
! Allocation
!
allocate( z_Sigma (1:kmax) )
allocate( r_Sigma (0:kmax) )
allocate( z_DelSigma (1:kmax) )
allocate( r_DelSigma (0:kmax) )
allocate( w_Number (1:(nmax+1)**2) )
allocate( r_SSDepth( 0:kslmax ) )
allocate( z_SSDepth( 1:kslmax ) )
! �����������¤ã��¨å®�
! Default values settings
!
! Sigma (���´æ�°ã�������) �������� (�¡å�¹ã����) ��¨å®�
! Setting of initial value (invalid value) of "Sigma" (half level sigma)
!
Sigma = -999.0d0
! �°ä���±¤������¢æ·±���������� (�¡å�¹ã����) ��¨å®�
! Setting of initial value (invalid value) of depth of subsurface layer interface
!
Depth = -999.0d0
! ���´å±¤�°ã�����������������������°ã��¨å®�
! Setting of flag for generation of sigma levels internally
!
flag_generate_sigma = .false.
! Longitude in unit of degree of a grid point in 1D mode
!
LonInDeg = 0.0_DP
! Latitude in unit of degree of a grid point in 1D mode
!
LatInDeg = 0.0_DP
! NAMELIST ����¿è¾¼��
! NAMELIST is input
!
if ( trim(namelist_filename) /= '' ) then
call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in)
rewind( unit_nml )
read( unit_nml, nml = axesset_nml, iostat = iostat_nml ) ! (out)
close( unit_nml )
call NmlutilMsg( iostat_nml, module_name ) ! (in)
end if
! Sigma (���´æ�°ã�������) ������è¨å�
! Automation setting of "Sigma" (half level sigma)
!
if ( all( Sigma == -999.0d0 ) ) then
if ( flag_generate_sigma ) then
call SigmaDataGetHalf( Sigma(1:kmax+1) ) ! (out)
else
call MessageNotify( 'E', module_name, ' Sigma levels have to be specified if flag_generate_sigma is not true.' )
end if
end if
! Sigma (���´æ�°ã�������) ���§ã����
! Check "Sigma" (half level sigma)
!
if ( Sigma(1) /= 1.0_DP ) then
call MessageNotify( 'E', module_name, ' Sigma(1) is not 1, but is %f', d = (/ Sigma(1) /) )
end if
if ( Sigma(kmax+1) /= 0.0_DP ) then
call MessageNotify( 'E', module_name, ' Sigma(kmax+1) is not 0, but is %f', d = (/ Sigma(kmax+1) /) )
end if
do k = 1, kmax
if ( Sigma(k+1) > Sigma(k) ) then
call MessageNotify( 'M', module_name, ' Sigma(%d) = %f > Sigma(%d) = %f', i = (/ k+1, k /), d = (/ Sigma(k+1), Sigma(k) /) )
call MessageNotify( 'E', module_name, ' Value of Sigma has to decrease with index.' )
end if
end do
! r_Sigma (���´æ�°ã�������) è¨å�
! Setting of "r_Sigma" (half level sigma)
!
r_Sigma(0:kmax) = Sigma(1:kmax+1)
! z_DelSigma (�´æ�°ã������ $ \Delta \sigma $ ) è¨å�
! Setting of "z_DelSigma" (full level $ \Delta \sigma $ )
!
do k = 1, kmax
z_DelSigma(k) = r_Sigma(k-1) - r_Sigma(k)
enddo
! z_Sigma (�´æ�°ã�������) è¨å�
! Setting of "z_Sigma" (full level sigma)
!
Kappa = GasRDry / CpDry
do k = 1, kmax
z_Sigma(k) = ( ( r_Sigma(k-1) ** ( 1.0_DP + Kappa ) - r_Sigma(k) ** ( 1.0_DP + Kappa ) ) / ( z_DelSigma(k) * ( 1.0_DP + Kappa ) ) ) ** ( 1.0_DP / Kappa )
enddo
! r_DelSigma (���´æ�°ã������ $ \Delta \sigma $ ) è¨å�
! Setting of "r_DelSigma" (half level $ \Delta \sigma $ )
!
r_DelSigma(0) = r_Sigma(0) - z_Sigma(1)
r_DelSigma(kmax) = z_Sigma(kmax) - r_Sigma(kmax)
do k = 1, kmax - 1
r_DelSigma(k) = z_Sigma(k) - z_Sigma(k+1)
end do
! �°ä���±¤������¢æ·±�������§ã����
! Check depth of subsurface layer interface
!
if ( all( Depth == -999.0d0 ) ) then
Depth(0+1:kslmax+1 ) = 0.0_DP
call MessageNotify( 'W', module_name, 'Depth is not found in namelist file.' )
end if
!
if ( Depth(0+1) /= 0.0_DP ) then
call MessageNotify( 'E', module_name, ' Depth(0) is not zero, but is %f', d = (/ Depth(0+1) /) )
end if
if ( kslmax >= 1 ) then
if ( all( Depth(1+1:kslmax+1) >= 0.0_DP ) ) then
do k = 0, kslmax
call MessageNotify( 'M', module_name, ' Depth(%d) = %f', i = (/ k /), d = (/ Depth(k+1) /) )
end do
call MessageNotify( 'E', module_name, ' Depth has to be zero or negative.' )
end if
end if
do k = 0, kslmax-1
if ( Depth(k+1+1) > Depth(k+1) ) then
call MessageNotify( 'M', module_name, ' Depth(%d) = %f > Depth(%d) = %f', i = (/ k+1, k /), d = (/ Depth(k+1+1), Depth(k+1) /) )
call MessageNotify( 'E', module_name, ' Value of Depth has to decrease with index.' )
end if
end do
r_SSDepth(0:kslmax) = Depth(1:kslmax+1)
do k = 0, kslmax
call MessageNotify( 'M', module_name, ' r_SSDepth(%d) = %f', i = (/ k /), d = (/ r_SSDepth(k) /) )
end do
! �°ä������´å±¤��¸å¿��¹ã��¨å®�
! Set midpoint of subsurface grid
!
do k = 1, kslmax
z_SSDepth( k ) = ( r_SSDepth( k-1 ) + r_SSDepth( k ) ) / 2.0d0
end do
! ç·�º¦çµ�åº���¨å®�
! Settings of longitude and latitude
!
allocate( x_Lon (0:imax-1) )
allocate( x_Lon_Weight (0:imax-1) )
allocate( y_Lat (1:jmax) )
allocate( y_Lat_Weight (1:jmax) )
if ( ( imax == 1 ) .and. ( jmax == 1 ) ) then
x_Lon = LonInDeg * PI / 180.0_DP
x_Lon_Weight = 1.0_DP
y_Lat = LatInDeg * PI / 180.0_DP
y_Lat_Weight = 1.0_DP
else
if ( .not. spml_inited ) then
#ifdef LIB_MPI
call wa_mpi_Initial( nmax, imax, jmax_global, kmax, OMPNumThreads ) ! (in)
! Check number of latitudinal grid on each process
call GridsetCheckNumberOfLatGrid( spml_jc )
#else
call wa_Initial( nmax, imax, jmax_global, kmax, OMPNumThreads ) ! (in)
#endif
spml_inited = .true.
end if
x_Lon = spml_x_Lon
x_Lon_Weight = spml_x_Lon_Weight
y_Lat = spml_y_Lat
y_Lat_Weight = spml_y_Lat_Weight
end if
if ( imax /= 1 ) then
! DeltaLon, InvDeltaLon����
! Caluculate DeltaLon and InvDeltaLon
DeltaLon = x_Lon(1) - x_Lon(0)
InvDeltaLon = 1.0_DP/DeltaLon
else
DeltaLon = 0.0_DP
InvDeltaLon = 0.0_DP ! not used
endif
! �¹ã�����������¼ã�¿ã��·»å���垩��¨å®�
! Settings of subscript of spectral data
!
do i = 1, size(w_Number)
w_Number(i) = i
end do
! ���³ã�����¢ã�������±ã���å¾�
! Get information about rank
!
myrank_mpi = -1
nprocs_mpi = 1
rank_str = ''
! �°å� ; Print
!
call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
#ifdef SJPACK
call MessageNotify( 'M', module_name, 'SJPACK : %c', c1 = 'used.' )
#else
call MessageNotify( 'M', module_name, 'SJPACK : %c', c1 = 'not used.' )
#endif
call MessageNotify( 'M', module_name, 'OMPNumThreads = %d', i = (/OMPNumThreads/) )
do ra = 0, nprocs_mpi - 1
call MessageNotify( 'M', module_name, 'Axes:%c', c1 = trim(rank_str), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' x_Lon(%d:%d) [deg.] = %*f', i = (/ 0, imax - 1/), d = format_print(x_Lon / PI * 180.0_DP, imax), n =(/ imax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' y_Lat(%d:%d) [deg.] = %*f', i = (/ 1, jmax/), d = format_print(y_Lat / PI * 180.0_DP, jmax), n =(/ jmax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' z_Sigma(%d:%d) = %*f', i = (/ 1, kmax /), d = format_print(z_Sigma, kmax), n =(/ kmax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' r_Sigma(%d:%d) = %*f', i = (/ 0, kmax /), d = format_print(r_Sigma, kmax+1), n =(/ kmax+1 /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' w_Number(%d:%d) = %d .. %d', i = (/ 1, size(w_Number), 1, size(w_Number) /), rank_mpi = -1 )
!
call MessageNotify( 'M', module_name, 'Weight:' )
call MessageNotify( 'M', module_name, ' x_Lon_Weight(%d:%d) = %*f', i = (/ 0, imax - 1/), d = format_print(x_Lon_Weight, imax), n =(/ imax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' y_Lat_Weight(%d:%d) = %*f', i = (/ 1, jmax/), d = format_print(y_Lat_Weight, jmax), n =(/ jmax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, ' z_DelSigma(%d:%d) = %*f', i = (/ 1, kmax /), d = format_print(z_DelSigma, kmax), n =(/ kmax /), rank_mpi = -1 )
call MessageNotify( 'M', module_name, '' )
end do
call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version), rank_mpi = -1 )
axesset_inited = .true.
end subroutine AxessetInit