SCALE-RM
Functions/Subroutines | Variables
mod_cnvlanduse Module Reference

module Convert LandUseIndex More...

Functions/Subroutines

subroutine, public cnvlanduse_setup
 Setup. More...
 
subroutine, public cnvlanduse
 Driver. More...
 

Variables

logical, public cnvlanduse_donothing
 
logical, public cnvlanduse_useglccv2 = .false.
 
logical, public cnvlanduse_uselu100m = .false.
 
logical, public cnvlanduse_usejibis = .false.
 

Detailed Description

module Convert LandUseIndex

Description
subroutines for preparing landuse index data (convert from external file)
Author
Team SCALE
NAMELIST
  • PARAM_CNVLANDUSE
    nametypedefault valuecomment
    CNVLANDUSE_NAME character(len=H_SHORT) 'NONE' keep backward compatibility
    CNVLANDUSE_USEGLCCV2 logical .false.
    CNVLANDUSE_USELU100M logical .false.

  • PARAM_CNVLANDUSE_GLCCv2
    nametypedefault valuecomment
    GLCCV2_IN_DIR character(len=H_LONG) '.' directory contains GLCCv2 files (GrADS format)
    GLCCV2_IN_CATALOGUE character(len=H_LONG) '' metadata files for GLCCv2

  • PARAM_CNVLANDUSE_LU100M
    nametypedefault valuecomment
    LU100M_IN_DIR character(len=H_LONG) '.' directory contains LU100M files (GrADS format)
    LU100M_IN_CATALOGUE character(len=H_LONG) '' metadata files for LU100M

History Output
No history output

Function/Subroutine Documentation

◆ cnvlanduse_setup()

subroutine, public mod_cnvlanduse::cnvlanduse_setup ( )

Setup.

Definition at line 65 of file mod_cnvlanduse.F90.

References cnvlanduse_donothing, cnvlanduse_useglccv2, cnvlanduse_usejibis, cnvlanduse_uselu100m, scale_io::io_fid_conf, and scale_prc::prc_abort().

Referenced by mod_convert::convert_setup().

65  use scale_prc, only: &
66  prc_abort
67  implicit none
68 
69  character(len=H_SHORT) :: cnvlanduse_name = 'NONE' ! keep backward compatibility
70 
71  namelist / param_cnvlanduse / &
72  cnvlanduse_name, &
73  cnvlanduse_useglccv2, &
74  cnvlanduse_uselu100m, &
75 ! CNVLANDUSE_UseJIBIS
76  cnvlanduse_limit_urban_fraction
77 
78  integer :: ierr
79  !---------------------------------------------------------------------------
80 
81  log_newline
82  log_info("CNVLANDUSE_setup",*) 'Setup'
83  !--- read namelist
84  rewind(io_fid_conf)
85  read(io_fid_conf,nml=param_cnvlanduse,iostat=ierr)
86  if( ierr < 0 ) then !--- missing
87  log_info("CNVLANDUSE_setup",*) 'Not found namelist. Default used.'
88  elseif( ierr > 0 ) then !--- fatal error
89  log_error("CNVLANDUSE_setup",*) 'Not appropriate names in namelist PARAM_CNVLANDUSE. Check!'
90  call prc_abort
91  endif
92  log_nml(param_cnvlanduse)
93 
94  select case(cnvlanduse_name)
95  case('NONE')
96  ! do nothing
97  case('GLCCv2')
98  cnvlanduse_useglccv2 = .true.
99  cnvlanduse_uselu100m = .false.
100  cnvlanduse_usejibis = .false.
101  case('LU100M')
102  cnvlanduse_useglccv2 = .false.
103  cnvlanduse_uselu100m = .true.
104  cnvlanduse_usejibis = .false.
105  case('COMBINE')
106  cnvlanduse_useglccv2 = .true.
107  cnvlanduse_uselu100m = .true.
108  cnvlanduse_usejibis = .true.
109  case default
110  log_error("CNVLANDUSE_setup",*) 'Unsupported TYPE: ', trim(cnvlanduse_name)
111  call prc_abort
112  endselect
113 
114  cnvlanduse_donothing = .true.
115 
116  if ( cnvlanduse_useglccv2 ) then
117  cnvlanduse_donothing = .false.
118  log_info("CNVLANDUSE_setup",*) 'Use GLCC ver.2, global 30 arcsec. data'
119  if ( cnvlanduse_uselu100m ) then
120  log_info("CNVLANDUSE_setup",*) 'Use KSJ landuse 100m data for Japan region'
121  log_info("CNVLANDUSE_setup",*) 'Overwrite Japan region'
122  if ( cnvlanduse_usejibis ) then
123  log_info("CNVLANDUSE_setup",*) 'Use J-IBIS map 100m data for Japan region'
124  log_info("CNVLANDUSE_setup",*) 'Overwrite Japan region (PFT only)'
125  endif
126  endif
127  elseif ( cnvlanduse_uselu100m ) then
128  cnvlanduse_donothing = .false.
129  log_info("CNVLANDUSE_setup",*) 'Use KSJ landuse 100m data, Japan region only'
130  if ( cnvlanduse_usejibis ) then
131  log_info("CNVLANDUSE_setup",*) 'Use J-IBIS map 100m data for Japan region'
132  log_info("CNVLANDUSE_setup",*) 'Overwrite Japan region (PFT only)'
133  endif
134  endif
135 
136  if ( cnvlanduse_donothing ) then
137  log_info("CNVLANDUSE_setup",*) 'Do nothing for landuse index'
138  endif
139 
140  return
integer, public io_fid_conf
Config file ID.
Definition: scale_io.F90:55
module PROCESS
Definition: scale_prc.F90:11
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cnvlanduse()

subroutine, public mod_cnvlanduse::cnvlanduse ( )

Driver.

Definition at line 146 of file mod_cnvlanduse.F90.

References scale_atmos_grid_cartesc::atmos_grid_cartesc_cx, scale_atmos_grid_cartesc::atmos_grid_cartesc_cy, scale_atmos_grid_cartesc::atmos_grid_cartesc_fx, scale_atmos_grid_cartesc::atmos_grid_cartesc_fy, scale_atmos_grid_cartesc_real::atmos_grid_cartesc_real_area, scale_atmos_grid_cartesc_real::atmos_grid_cartesc_real_dlat, scale_atmos_grid_cartesc_real::atmos_grid_cartesc_real_latxv, scale_atmos_grid_cartesc_real::atmos_grid_cartesc_real_lonuy, cnvlanduse_donothing, cnvlanduse_useglccv2, cnvlanduse_usejibis, cnvlanduse_uselu100m, scale_const::const_d2r, scale_const::const_eps, scale_const::const_radius, scale_const::const_undef2, scale_file_tiledata::file_tiledata_get_info(), scale_atmos_grid_cartesc_index::ia, scale_atmos_grid_cartesc_index::ie, scale_io::io_fid_conf, scale_atmos_grid_cartesc_index::is, scale_atmos_grid_cartesc_index::ja, scale_atmos_grid_cartesc_index::je, scale_atmos_grid_cartesc_index::js, scale_landuse::landuse_calc_fact(), scale_landuse::landuse_fillhalo(), scale_landuse::landuse_frac_lake, scale_landuse::landuse_frac_land, scale_landuse::landuse_frac_pft, scale_landuse::landuse_frac_urban, scale_landuse::landuse_index_pft, scale_landuse::landuse_pft_mosaic, scale_landuse::landuse_pft_nmax, scale_landuse::landuse_write(), and scale_prc::prc_abort().

Referenced by mod_convert::convert().

146  use scale_const, only: &
147  eps => const_eps, &
148  d2r => const_d2r
149  use scale_prc, only: &
150  prc_abort
151  use scale_sort, only: &
152  sort_exec
153  use scale_landuse, only: &
164  use scale_atmos_grid_cartesc_real, only: &
169  implicit none
170 
171  real(RP) :: pft_weight(-2:landuse_pft_nmax,ia,ja)
172  integer :: pft_idx(landuse_pft_nmax)
173  real(RP) :: lake_wgt, ocean_wgt, urban_wgt, land_wgt
174  real(RP) :: allsum
175  real(RP) :: zerosw
176 
177  integer :: i, j, p
178  !---------------------------------------------------------------------------
179 
180  if ( cnvlanduse_donothing ) then
181  log_newline
182  log_progress(*) 'skip convert landuse data'
183  else
184  log_newline
185  log_progress(*) 'start convert landuse data'
186 
187  domain_lats = minval( latxv(:,:) )
188  domain_late = maxval( latxv(:,:) )
189  domain_lons = minval( lonuy(:,:) )
190  domain_lone = maxval( lonuy(:,:) )
191  domain_dlat = maxval( dlat(:,:) )
192 
193  allocate( domain_dxy(ia,ja) )
194  do j = 1, ja
195  do i = 1, ia
196  domain_dxy(i,j) = sqrt( area(i,j) )
197  end do
198  end do
199 
200  log_info("CNVLANDUSE",*) 'Domain Information'
201  log_info_cont(*) 'Domain (LAT) :', domain_lats/d2r, domain_late/d2r
202  log_info_cont(*) ' (LON) :', domain_lons/d2r, domain_lone/d2r
203 
204 
205  !$omp parallel do
206 !OCL XFILL
207  do j = 1, ja
208  do i = 1, ia
209  pft_weight(:,i,j) = 0.0_rp
210  end do
211  end do
212 
213  if ( cnvlanduse_useglccv2 ) then
214  call cnvlanduse_glccv2( pft_weight(:,:,:) ) ! [INOUT]
215  endif
216 
217  if ( cnvlanduse_uselu100m ) then
218  call cnvlanduse_lu100m( pft_weight(:,:,:) ) ! [INOUT]
219  endif
220 
221  if ( cnvlanduse_usejibis ) then
222  call cnvlanduse_jibis( pft_weight(:,:,:) ) ! [INOUT]
223  endif
224 
225  deallocate( domain_dxy )
226 
227  !$omp parallel do &
228  !$omp private(lake_wgt,ocean_wgt,urban_wgt,land_wgt,allsum,zerosw,PFT_idx)
229  do j = js, je
230  do i = is, ie
231 
232  lake_wgt = pft_weight(-2,i,j)
233  ocean_wgt = pft_weight(-1,i,j)
234  urban_wgt = pft_weight( 0,i,j)
235  land_wgt = sum( pft_weight(1:,i,j) )
236 
237  do p = 1, landuse_pft_nmax
238  pft_idx(p) = p
239  end do
240  call sort_exec( landuse_pft_nmax, pft_weight(1:,i,j), pft_idx(:) )
241 
242 
243  ! total = ocean + lake + urban + land
244 
245  ! land fraction : total - ocean / total
246  allsum = lake_wgt + ocean_wgt + urban_wgt + land_wgt
247  zerosw = 0.5_rp - sign( 0.5_rp, allsum-eps )
248  landuse_frac_land(i,j) = ( allsum-ocean_wgt ) * ( 1.0_rp-zerosw ) / ( allsum-zerosw )
249 
250  ! lake fraction : lake / ( lake + urban + land )
251  allsum = lake_wgt + urban_wgt + land_wgt
252  zerosw = 0.5_rp - sign( 0.5_rp, allsum-eps )
253  landuse_frac_lake(i,j) = lake_wgt * ( 1.0_rp-zerosw ) / ( allsum-zerosw )
254 
255  ! urban fraction : urban / ( urban + land )
256  allsum = urban_wgt + land_wgt
257  zerosw = 0.5_rp - sign( 0.5_rp, allsum-eps )
258  landuse_frac_urban(i,j) = urban_wgt * ( 1.0_rp-zerosw ) / ( allsum-zerosw )
259 
260  ! PFT fraction : PFT / sum( PFT(1:mosaic) )
261  allsum = sum( pft_weight(landuse_pft_nmax-landuse_pft_mosaic+1:,i,j) )
262  if ( allsum > eps ) then
263  do p = 1, landuse_pft_mosaic
264  landuse_frac_pft(i,j,p) = pft_weight(landuse_pft_nmax-p+1,i,j) / allsum
265  landuse_index_pft(i,j,p) = pft_idx(landuse_pft_nmax-p+1)
266  enddo
267  ! if no second PFT, set to same as PFT1
268  if ( abs(landuse_frac_pft(i,j,1)-1.0_rp) <= eps ) then
269  landuse_frac_pft(i,j,:) = 0.0_rp
270  landuse_frac_pft(i,j,1) = 1.0_rp
271  landuse_index_pft(i,j,:) = pft_idx(landuse_pft_nmax)
272  endif
273  else ! if no PFT, set to bare ground
274  landuse_frac_pft(i,j,:) = 0.0_rp
275  landuse_frac_pft(i,j,1) = 1.0_rp
276  landuse_index_pft(i,j,:) = 1
277  endif
278 
279  enddo
280  enddo
281 
282  if ( cnvlanduse_limit_urban_fraction < 1.0_rp ) then
283  !$omp parallel do
284  do j = js, je
285  do i = is, ie
286  if ( landuse_frac_urban(i,j) == 1.0_rp ) then ! if no PFT, set to grassland
287  landuse_frac_pft(i,j,:) = 0.0_rp
288  landuse_frac_pft(i,j,1) = 1.0_rp
289  landuse_index_pft(i,j,:) = 2 ! Grassland
290  endif
291  landuse_frac_urban(i,j) = min( landuse_frac_urban(i,j), cnvlanduse_limit_urban_fraction )
292  enddo
293  enddo
294  endif
295 
296  ! calculate landuse factors
297  call landuse_fillhalo( fill_bnd=.true. )
298  call landuse_calc_fact
299 
300  log_progress(*) 'end convert landuse data'
301 
302  ! output landuse file
303  call landuse_write
304 
305  endif
306 
307  return
real(rp), dimension(:,:,:), allocatable, public landuse_frac_pft
fraction of PFT for each mosaic
subroutine, public landuse_fillhalo(FILL_BND)
HALO Communication.
subroutine, public landuse_calc_fact
real(rp), public const_d2r
degree to radian
Definition: scale_const.F90:32
real(rp), dimension(:,:), allocatable, public landuse_frac_urban
urban fraction
module LANDUSE
module PROCESS
Definition: scale_prc.F90:11
subroutine, public landuse_write
Write landuse data.
real(rp), dimension(:,:), allocatable, public atmos_grid_cartesc_real_lonuy
longitude at staggered point (uy) [rad,0-2pi]
integer, public landuse_pft_mosaic
number of PFT mosaic
integer, dimension(:,:,:), allocatable, public landuse_index_pft
index of PFT for each mosaic
real(rp), dimension(:,:), allocatable, public atmos_grid_cartesc_real_dlat
delta latitude
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
module CONSTANT
Definition: scale_const.F90:11
real(rp), public const_eps
small number
Definition: scale_const.F90:33
real(rp), dimension(:,:), allocatable, public landuse_frac_lake
lake fraction
module Atmosphere GRID CartesC Real(real space)
real(rp), dimension(:,:), allocatable, public atmos_grid_cartesc_real_area
horizontal area ( xy, normal z) [m2]
integer, public landuse_pft_nmax
number of plant functional type(PFT)
real(rp), dimension(:,:), allocatable, public atmos_grid_cartesc_real_latxv
latitude at staggered point (xv) [rad,-pi,pi]
real(rp), dimension(:,:), allocatable, public landuse_frac_land
land fraction
module SORT
Definition: scale_sort.F90:11
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ cnvlanduse_donothing

logical, public mod_cnvlanduse::cnvlanduse_donothing

Definition at line 35 of file mod_cnvlanduse.F90.

Referenced by cnvlanduse(), and cnvlanduse_setup().

35  logical, public :: cnvlanduse_donothing

◆ cnvlanduse_useglccv2

logical, public mod_cnvlanduse::cnvlanduse_useglccv2 = .false.

Definition at line 36 of file mod_cnvlanduse.F90.

Referenced by cnvlanduse(), and cnvlanduse_setup().

36  logical, public :: cnvlanduse_useglccv2 = .false.

◆ cnvlanduse_uselu100m

logical, public mod_cnvlanduse::cnvlanduse_uselu100m = .false.

Definition at line 37 of file mod_cnvlanduse.F90.

Referenced by cnvlanduse(), and cnvlanduse_setup().

37  logical, public :: cnvlanduse_uselu100m = .false.

◆ cnvlanduse_usejibis

logical, public mod_cnvlanduse::cnvlanduse_usejibis = .false.

Definition at line 38 of file mod_cnvlanduse.F90.

Referenced by cnvlanduse(), and cnvlanduse_setup().

38  logical, public :: cnvlanduse_usejibis = .false.