5.13.2-dev0
mHM
The mesoscale Hydrological Model
Loading...
Searching...
No Matches
mo_mpr_startup.f90
Go to the documentation of this file.
1!> \file mo_mpr_startup.f90
2!> \brief \copybrief mo_mpr_startup
3!> \details \copydetails mo_mpr_startup
4
5!> \brief Startup procedures for mHM.
6!> \details This module initializes all variables required to run mHM. This
7!! module needs to be run only one time at the beginning of a simulation if re-starting files do not exist.
8!> \authors Luis Samaniego, Rohini Kumar
9!> \date Dec 2012
10!> \copyright Copyright 2005-\today, the mHM Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
11!! mHM is released under the LGPLv3+ license \license_note
12!> \ingroup f_mpr
14
15 USE mo_kind, ONLY : i4, dp
16 use mo_common_constants, only : nodata_i4, nodata_dp ! global nodata values (i4, dp)
17
18 IMPLICIT NONE
19
20 PRIVATE
21
22 PUBLIC :: mpr_initialize, init_eff_params ! initialization sequence
23
24CONTAINS
25
26 !> \brief Initialize main mHM variables
27 !> \details Initialize main mHM variables for a given domain.
28 !! Calls the following procedures in this order:
29 !! - Constant initialization.
30 !! - Generate soil database.
31 !! - Checking inconsistencies input fields.
32 !! - Variable initialization at level-0.
33 !! - Variable initialization at level-1.
34 !! - Variable initialization at level-11.
35 !! - Space allocation of remaining variable/parameters.
36 !! Global variables will be used at this stage.
37 !> \changelog
38 !! - Luis Samaniego Mar 2008
39 !! - fully distributed multilayer
40 !! - Rohini Kumar Oct 2010
41 !! - matrix to vector version
42 !! - openmp parallelization
43 !! - routing level 11
44 !! - Luis Samaniego Jul 2012
45 !! - removal of IMSL dependencies
46 !! - Luis Samaniego Dec 2012
47 !! - modular version
48 !! - Rohini Kumar May 2013
49 !! - code cleaned and error checks
50 !! - Rohini Kumar Nov 2013
51 !! - updated documentation
52 !! - Stephan Thober Jun 2014
53 !! - copied L2 initialization from mo_meteo_forcings
54 !! - Stephan Thober Jun 2014
55 !! - updated flag for read_restart
56 !! - Stephan Thober Aug 2015
57 !! - removed initialisation of routing
58 !! - Rohini Kumar Mar 2016
59 !! - changes for handling multiple soil database options
60 !! - Robert Schweppe Jun 2018
61 !! - refactoring and reformatting
62 !> \authors Luis Samaniego, Rohini Kumar
63 !> \date Dec 2012
64 subroutine mpr_initialize
65
68 use mo_kind, only : i4
69 use mo_read_latlon, only : read_latlon
71
72 implicit none
73
74 integer(i4) :: idomain
75
76
77 ! soilDB common for all domains
79
80 allocate(level1(domainmeta%nDomains))
81 allocate(l0_l1_remap(domainmeta%nDomains))
82
83 ! L0 and L1 initialization
84 do idomain = 1, domainmeta%nDomains
85 if (idomain .eq. 1) then
86 call l0_check_input(domainmeta%L0DataFrom(idomain))
87 call l0_variable_init(domainmeta%L0DataFrom(idomain))
88 ! ToDo: adopt to parallel
89 ! ToDo: check change
90 else if (domainmeta%L0DataFrom(idomain) == idomain) then
91 ! this needs only be done if there is new input
92 call l0_check_input(domainmeta%L0DataFrom(idomain))
93 call l0_variable_init(domainmeta%L0DataFrom(idomain))
94 end if
95
96 call init_lowres_level(level0(domainmeta%L0DataFrom(idomain)), resolutionhydrology(idomain), &
97 level1(idomain), l0_l1_remap(idomain))
98 ! read lat lon coordinates for level 1
99 call read_latlon(idomain, "lon", "lat", "level1", level1(idomain))
100
101 ! Parameter fields have to be allocated in any case
102 call init_eff_params(level1(idomain)%nCells)
103
104 end do
105
107
108 end subroutine mpr_initialize
109
110
111 !> \brief Check for errors in L0 input data
112 !> \details Check for possible errors in input data (morphological and land cover) at level-0
113 !> \changelog
114 !! - Rohini Kumar Aug 2013
115 !! - added iFlag_LAI_data_format to handle LAI options, and changed within the code made accordingly
116 !! - Rohini Kumar Sep 2013
117 !! - read input data for routing processes according & Stephan Thober, to process_matrix flag
118 !! - Stephan Thober Aug 2015
119 !! - moved check of L0 routing variables to mRM
120 !! - Rohini Kumar Mar 2016
121 !! - changes for handling multiple soil database options
122 !! - Robert Schweppe Jun 2018
123 !! - refactoring and reformatting
124 !> \authors Rohini Kumar
125 !> \date Jan 2013
126 subroutine l0_check_input(iDomain)
127
128 use mo_common_constants, only : eps_dp
130 use mo_message, only : error_message
133 use mo_string_utils, only : num2str
134 use mo_utils, only : eq
135
136 implicit none
137
138 !> domain id
139 integer(i4), intent(in) :: iDomain
140
141 integer(i4) :: k, n, nH
142
143 CHARACTER(len=1024) :: message_text = ''
144
145 ! START CHECKING VARIABLES
146 do k = level0(idomain)%iStart, level0(idomain)%iEnd
147
148 ! elevation [m]
149 if (abs(l0_elev(k) - nodata_dp) .lt. eps_dp) then
150 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)'))
151 call error_message(' Error: elevation has missing value within the valid masked area at cell in domain ', &
152 trim(message_text))
153 end if
154
155 ! slope [%]
156 if (abs(l0_slope(k) - nodata_dp) .lt. eps_dp) then
157 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)'))
158 call error_message(' Error: slope has missing value within the valid masked area at cell in domain ', &
159 trim(message_text))
160 end if
161
162 ! aspect [degree]
163 if (abs(l0_asp(k) - nodata_dp) .lt. eps_dp) then
164 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)'))
165 call error_message(' Error: aspect has missing values within the valid masked area at cell in domain ', &
166 trim(message_text))
167 end if
168
169 ! soil-Id [-]
170 nh = 1 !> by default; when iFlag_soilDB = 0
171 if (iflag_soildb .eq. 1) nh = nsoilhorizons_mhm
172 ! another option to handle multiple soil horizons properties
173 do n = 1, nh
174 if (l0_soilid(k, n) .eq. nodata_i4) then
175 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)')) // ',' // trim(num2str(n, '(I5)'))
176 call error_message(' Error: soil id has missing values within the valid masked area at cell in domain and horizon ', &
177 trim(message_text))
178 end if
179 end do
180
181 ! geological-Id [-]
182 if (l0_geounit(k) .eq. nodata_i4) then
183 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)'))
184 call error_message(' Error: geological formation id has missing values within the valid masked area at cell in domain ', &
185 trim(message_text))
186 end if
187
188 ! landcover scenes
189 do n = 1, nlcoverscene
190 if (l0_lcover(k, n) .eq. nodata_i4) then
191 message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(idomain, '(I5)')) // ',' // trim(num2str(n, '(I5)'))
192 call error_message(' Error: land cover id has missing values within the valid masked area at cell in domain and scene ', &
193 trim(message_text))
194 end if
195 end do
196
197 ! land cover scenes related to LAI
198 if(timestep_lai_input .EQ. 0) then
199 if (eq(l0_gridded_lai(k, 1), nodata_dp)) then
200 message_text = trim(num2str(k, '(G5.3)')) // ',' // trim(num2str(idomain, '(I5)'))
201 call error_message(' Error: gridded LAI has missing values within the valid masked area at cell in domain ', &
202 trim(message_text))
203 end if
204 end if
205
206 end do
207
208 end subroutine l0_check_input
209
210
211 !> \brief level 0 variable initialization
212 !> \details following tasks are performed for L0 data sets
213 !! - cell id & numbering
214 !! - storage of cell cordinates (row and coloum id)
215 !! - empirical dist. of terrain slope
216 !! - flag to determine the presence of a particular soil id
217 !! in this configuration of the model run
218 !! If a variable is added or removed here, then it also has to
219 !! be added or removed in the subroutine config_variables_set in
220 !! module mo_restart and in the subroutine set_config in module
221 !! mo_set_netcdf_restart
222 !> \changelog
223 !! - Rohini Kumar & Matthias Cuntz May 2014
224 !! - cell area calulation based on a regular lat-lon grid or on a regular X-Y coordinate system
225 !! - Matthias Cuntz May 2014
226 !! - changed empirical distribution function so that doubles get the same value
227 !! - Matthias Zink & Matthias Cuntz Feb 2016
228 !! - code speed up due to reformulation of CDF calculation
229 !! - Rohini Kumar Mar 2016
230 !! - changes for handling multiple soil database options
231 !! - Maren Kaluza Feb 2018
232 !! - removed slope_val, temp, only sort the index to speed up finding the empirical distribution slope_emp
233 !! - Robert Schweppe Jun 2018
234 !! - refactoring and reformatting
235 !> \authors Rohini Kumar
236 !> \date Jan 2013
237 subroutine l0_variable_init(iDomain)
238
239 use mo_append, only : append
240 use mo_common_variables, only : level0
241 use mo_grid, only : l0_grid_setup
244 use mo_orderpack, only : sort_index
245 use mo_utils, only : eq
246
247 implicit none
248
249 !> domain id
250 integer(i4), intent(in) :: iDomain
251
252 real(dp), dimension(:), allocatable :: slope_emp
253
254 integer(i4), dimension(:), allocatable :: slope_sorted_index
255
256 integer(i4) :: i, j, k, nH, i_sort, i_sortpost
257
258 ! STEPS ::
259
260
261 !--------------------------------------------------------
262 ! 1) Estimate each variable locally for a given domain
263 ! 2) Pad each variable to its corresponding global one
264 !--------------------------------------------------------
265 !------------------------------------------------------
266 ! Assign whether a given soil type is present or not
267 !------------------------------------------------------
268 if (idomain .eq. 1) then
269 allocate(soildb%is_present(nsoiltypes))
270 soildb%is_present(:) = 0_i4
271 end if
272
273 call l0_grid_setup(level0(idomain))
274
275 !---------------------------------------------------
276 ! Estimate empirical distribution of slope
277 !---------------------------------------------------
278 allocate(slope_emp(level0(idomain)%nCells), slope_sorted_index(level0(idomain)%nCells))
279
280 ! get sorted data and sorted indexes to remap later
281 slope_sorted_index = sort_index(l0_slope(level0(idomain)%iStart : level0(idomain)%iEnd))
282
283 ! empirical distribution of slopes = cumulated number points with slopes that are <= the slope at this point
284 !
285 ! sorted data emp. CDF
286 ! 9 | x x 7/8 | x x
287 ! | |
288 ! 8 | x 5/8 | x
289 ! | |
290 ! 5 | x x x 4/8 | x x x
291 ! | |
292 ! 2 | x 1/8 | x
293 ! |__________________ |__________________
294 !
295 ! highest slope value = highest rank or No. of data points / (data points + 1)
296 slope_emp(slope_sorted_index(level0(idomain)%nCells)) = real(level0(idomain)%nCells, dp) / &
297 real(level0(iDomain)%nCells + 1_i4, dp)
298
299 ! backward loop to check if the preceding data point has the same slope value
300 do i = level0(idomain)%nCells - 1, 1, -1
301 i_sort=slope_sorted_index(i)
302 i_sortpost=slope_sorted_index(i+1)
303 if (eq(l0_slope(level0(idomain)%iStart-1_i4+i_sort), l0_slope(level0(idomain)%iStart-1_i4+i_sortpost))) then
304 ! if yes: assign the same probabitity
305 slope_emp(i_sort) = slope_emp(i_sortpost)
306 else
307 ! if not: assign rank / (data points + 1)
308 slope_emp(i_sort) = real(i, dp) / real(level0(idomain)%nCells + 1_i4, dp)
309 end if
310 end do
311
312 ! EXAMPLE
313 ! in = [ 7, 20, 31, 31, 12, 31, 42 ]
314 ! sorted = [ 7, 12, 20, 31, 31, 31, 42 ]
315 ! index = [ 1, 5, 2, 3, 4, 6, 7 ]
316 ! temp = [ 1, 2, 3, 6, 6, 6, 7 ]
317 ! out = [ 1, 3, 6, 6, 2, 6, 7 ] / (len(out) + 1 )
318
319 !--------------------------------------------------------
320 ! Start padding up local variables to global variables
321 !--------------------------------------------------------
322 call append(l0_slope_emp, slope_emp)
323
324 nh = 1_i4 !> by default; when iFlag_soilDB = 0
325 if (iflag_soildb .eq. 1) nh = nsoilhorizons_mhm
326 do i = 1, nh
327 do k = level0(idomain)%iStart, level0(idomain)%iEnd
328 j = l0_soilid(k, i)
329 soildb%is_present(j) = 1_i4
330 end do
331 end do
332
333 ! free space
334 deallocate(slope_emp, slope_sorted_index)
335
336
337 end subroutine l0_variable_init
338
339
340 !> \brief Allocation of space for mHM related L1 and L11 variables.
341 !> \details Allocation of space for mHM related L1 and L11 variables (e.g., states,
342 !! fluxes, and parameters) for a given domain. Variables allocated here is
343 !! defined in them mo_global_variables.f90 file. After allocating any variable
344 !! in this routine, initalize them in the following variables_default_init
345 !! subroutine.
346 !> \changelog
347 !! - R. Kumar Sep 2013
348 !! - documentation added according to the template
349 !! - S. Thober Aug 2015
350 !! - removed routing related variables
351 !! - Zink M. Demirel C. Mar 2017
352 !! - Init Jarvis soil water stress variable at SM process(3)
353 !! - Robert Schweppe Dec 2017
354 !! - restructured allocation in variables_alloc, expanded dimensions of effective parameters
355 !! - Robert Schweppe Jun 2018
356 !! - refactoring and reformatting
357 !! - Rohini Kumar Oct 2021
358 !! - Added Neutron count module to mHM integrate into develop branch (5.11.2)
359 !! - Sebastian Müller Mar 2023
360 !! - made L1_alpha, L1_kSlowFlow, L1_kBaseFlow and L1_kPerco land cover dependent
361 !> \authors Rohini Kumar
362 !> \date Jan 2013
363 subroutine init_eff_params(ncells1)
364
365 use mo_append, only : append
366 use mo_constants, only : yearmonths
376
377 implicit none
378
379 !> number of L1 cells
380 integer(i4), intent(in) :: ncells1
381
382 real(dp), dimension(:, :, :), allocatable :: dummy_3d
383
384 integer(i4) :: max_extent
385
386
387 ! get maximum extent of one dimension 2 or 3
388 max_extent = max(nsoilhorizons_mhm, int(yearmonths, i4), nlcoverscene, nlai)
389
390 ! for appending and intialization
391 allocate(dummy_3d(ncells1, max_extent, nlcoverscene))
392
393 dummy_3d = p1_initstatefluxes
394
395 !-------------------------------------------
396 ! EFFECTIVE PARAMETERS
397 !-------------------------------------------
398 call append(l1_fsealed, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
399 ! exponent for the upper reservoir
400 call append(l1_alpha, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
401 ! increase of the Degree-day factor per mm of increase in precipitation
402 call append(l1_degdayinc, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
403 ! maximum degree-day factor
404 call append(l1_degdaymax, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
405 ! degree-day factor with no precipitation
406 call append(l1_degdaynopre, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
407 ! degree-day factor
408 call append(l1_degday, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
409 ! Karstic percolation loss
410 call append(l1_karstloss, dummy_3d(:, 1 : 1, 1 : 1))
411 ! PET correction factor due to terrain aspect
412 call append(l1_fasp, dummy_3d(:, 1 : 1, 1 : 1))
413 ! PET correction factor due to LAI
414 call append(l1_petlaicorfactor, dummy_3d(:, 1 : nlai, 1 : nlcoverscene))
415 ! PET Hargreaves Samani coefficient
416 call append(l1_harsamcoeff, dummy_3d(:, 1 : 1, 1 : 1))
417 ! PET Prietley Taylor coefficient
418 call append(l1_prietayalpha, dummy_3d(:, 1 : nlai, 1 : 1))
419 ! PET aerodynamical resistance
420 call append(l1_aeroresist, dummy_3d(:, 1 : nlai, 1 : nlcoverscene))
421 ! PET bulk surface resistance
422 call append(l1_surfresist, dummy_3d(:, 1 : nlai, 1 : 1))
423 ! Fraction of roots in soil horizons
424 call append(l1_froots, dummy_3d(:, 1 : nsoilhorizons_mhm, 1 : nlcoverscene))
425 ! Maximum interception
426 call append(l1_maxinter, dummy_3d(:, 1 : nlai, 1 : 1))
427 ! fast interflow recession coefficient
428 call append(l1_kfastflow, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
429 ! slow interflow recession coefficient
430 call append(l1_kslowflow, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
431 ! baseflow recession coefficient
432 call append(l1_kbaseflow, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
433 ! percolation coefficient
434 call append(l1_kperco, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
435 ! Soil moisture below which actual ET is reduced linearly till PWP
436 call append(l1_soilmoistfc, dummy_3d(:, 1 : nsoilhorizons_mhm, 1 : nlcoverscene))
437 ! Saturation soil moisture for each horizon [mm]
438 call append(l1_soilmoistsat, dummy_3d(:, 1 : nsoilhorizons_mhm, 1 : nlcoverscene))
439 ! jarvis critical value for normalized soil water content
440 call append(l1_jarvis_thresh_c1, dummy_3d(:, 1 : 1, 1 : 1))
441 ! Exponential parameter to how non-linear is the soil water retention
442 call append(l1_soilmoistexp, dummy_3d(:, 1 : nsoilhorizons_mhm, 1 : nlcoverscene))
443 ! Threshold temperature for snow/rain
444 call append(l1_tempthresh, dummy_3d(:, 1 : 1, 1 : nlcoverscene))
445 ! Threshold water depth controlling fast interflow
446 call append(l1_unsatthresh, dummy_3d(:, 1 : 1, 1 : 1))
447 ! Threshold water depth for surface runoff in sealed surfaces
448 call append(l1_sealedthresh, dummy_3d(:, 1 : 1, 1 : 1))
449 ! Permanent wilting point
450 call append(l1_wiltingpoint, dummy_3d(:, 1 : nsoilhorizons_mhm, 1 : nlcoverscene))
451 ! neutron count related parameters
452 call append(l1_no_count, dummy_3d(:, 1:1, 1:1)) ! N0 count
453 call append(l1_bulkdens, dummy_3d(:, 1:nsoilhorizons_mhm, 1:nlcoverscene)) ! bulk density
454 call append(l1_latticewater, dummy_3d(:, 1:nsoilhorizons_mhm, 1:nlcoverscene)) ! lattice water
455 call append(l1_cosmicl3, dummy_3d(:, 1:nsoilhorizons_mhm, 1:nlcoverscene)) ! cosmic L3 parameter
456
457 ! free space
458 if (allocated(dummy_3d)) deallocate(dummy_3d)
459
460 end subroutine init_eff_params
461
462END MODULE mo_mpr_startup
Provides constants commonly used by mHM, mRM and MPR.
real(dp), parameter, public p1_initstatefluxes
real(dp), parameter, public eps_dp
epsilon(1.0) in double precision
real(dp), parameter, public nodata_dp
integer(i4), parameter, public nodata_i4
Provides structures needed by mHM, mRM and/or mpr.
real(dp), dimension(:), allocatable, public resolutionhydrology
type(domain_meta), public domainmeta
integer(i4), public nlcoverscene
real(dp), dimension(:), allocatable, public l0_elev
integer(i4), dimension(:, :), allocatable, public l0_lcover
type(grid), dimension(:), allocatable, target, public level1
type(grid), dimension(:), allocatable, target, public level0
type(gridremapper), dimension(:), allocatable, public l0_l1_remap
gridding tools
Definition mo_grid.f90:12
subroutine, public set_domain_indices(grids, indices)
TODO: add description.
Definition mo_grid.f90:205
subroutine, public init_lowres_level(highres, target_resolution, lowres, highres_lowres_remap)
Level-1 variable initialization.
Definition mo_grid.f90:59
subroutine, public l0_grid_setup(new_grid)
level 0 variable initialization
Definition mo_grid.f90:268
Global variables for mpr only.
real(dp), dimension(:, :, :), allocatable, public l1_degday
real(dp), dimension(:, :, :), allocatable, public l1_degdaymax
real(dp), dimension(:, :, :), allocatable, public l1_soilmoistexp
real(dp), dimension(:, :, :), allocatable, public l1_harsamcoeff
real(dp), dimension(:, :, :), allocatable, public l1_karstloss
real(dp), dimension(:, :, :), allocatable, public l1_unsatthresh
real(dp), dimension(:, :, :), allocatable, public l1_kperco
real(dp), dimension(:), allocatable, public l0_slope_emp
real(dp), dimension(:, :, :), allocatable, public l1_alpha
real(dp), dimension(:, :, :), allocatable, public l1_surfresist
integer(i4), dimension(:), allocatable, public l0_geounit
real(dp), dimension(:,:,:), allocatable, public l1_cosmicl3
real(dp), dimension(:), allocatable, public l0_asp
real(dp), dimension(:, :, :), allocatable, public l1_degdayinc
real(dp), dimension(:, :, :), allocatable, public l1_petlaicorfactor
real(dp), dimension(:, :, :), allocatable, public l1_fasp
real(dp), dimension(:, :, :), allocatable, public l1_kbaseflow
real(dp), dimension(:, :, :), allocatable, public l1_soilmoistfc
integer(i4), public nsoilhorizons_mhm
real(dp), dimension(:, :, :), allocatable, public l1_maxinter
real(dp), dimension(:,:,:), allocatable, public l1_bulkdens
real(dp), dimension(:, :, :), allocatable, public l1_degdaynopre
real(dp), dimension(:, :, :), allocatable, public l1_wiltingpoint
integer(i4), dimension(:, :), allocatable, public l0_soilid
real(dp), dimension(:, :), allocatable, public l0_gridded_lai
real(dp), dimension(:, :, :), allocatable, public l1_prietayalpha
real(dp), dimension(:, :, :), allocatable, public l1_fsealed
real(dp), dimension(:, :, :), allocatable, public l1_froots
real(dp), dimension(:, :, :), allocatable, public l1_jarvis_thresh_c1
real(dp), dimension(:, :, :), allocatable, public l1_tempthresh
real(dp), dimension(:,:,:), allocatable, public l1_no_count
real(dp), dimension(:, :, :), allocatable, public l1_kfastflow
real(dp), dimension(:, :, :), allocatable, public l1_kslowflow
real(dp), dimension(:, :, :), allocatable, public l1_aeroresist
real(dp), dimension(:, :, :), allocatable, public l1_sealedthresh
integer(i4), public timestep_lai_input
real(dp), dimension(:, :, :), allocatable, public l1_soilmoistsat
real(dp), dimension(:), allocatable, public l0_slope
real(dp), dimension(:,:,:), allocatable, public l1_latticewater
Startup procedures for mHM.
subroutine, public init_eff_params(ncells1)
Allocation of space for mHM related L1 and L11 variables.
subroutine l0_check_input(idomain)
Check for errors in L0 input data.
subroutine l0_variable_init(idomain)
level 0 variable initialization
subroutine, public mpr_initialize
Initialize main mHM variables.
reading latitude and longitude coordinates for each domain
subroutine, public read_latlon(ii, lon_var_name, lat_var_name, level_name, level)
reads latitude and longitude coordinates
Generating soil database from input file.
subroutine, public generate_soil_database
Generates soil database.